package com.study.controller;

import com.study.constant.ApiRouterConstant;
import com.study.convention.result.Result;
import com.study.convention.result.Results;
import com.study.dto.req.UserLoginReqDTO;
import com.study.dto.req.UserRegisterReqDTO;
import com.study.dto.req.UserUpdateReqDTO;
import com.study.dto.resp.UserLoginRespDTO;
import com.study.dto.resp.UserRespDTO;
import com.study.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * @author canace
 * @version 1.0
 * @description 用户控制类
 * @date 2024/1/23 12:10
 */

@RestController
@RequestMapping(ApiRouterConstant.BASE_API_ADMIN_USER_V1)
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 检查当前用户名是否存在
     *
     * @param username 用户名
     * @return true/false
     */
    @GetMapping("has-username")
    public Result<Boolean> hasUsername(@RequestParam("username") String username) {
        return Results.success(userService.hasUsername(username));
    }

    /**
     * 用户注册
     *
     * @param userRegisterReqDTO 用户注册参数
     * @return 成功
     */
    @PostMapping
    public Result<Void> register(@RequestBody UserRegisterReqDTO userRegisterReqDTO) {
        userService.register(userRegisterReqDTO);
        return Results.success();
    }

    /**
     * 用户登录
     *
     * @param userLoginReqDTO 用户登录参数
     * @return 用户登录信息
     */
    @PostMapping("login")
    public Result<UserLoginRespDTO> login(@RequestBody UserLoginReqDTO userLoginReqDTO) {
        return Results.success(userService.login(userLoginReqDTO));
    }

    /**
     * 用户退出登录
     */
    @DeleteMapping("logout")
    public Result<Void> logout() {
        userService.logout();
        return Results.success();
    }

    /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    @GetMapping("{username}")
    public Result<UserRespDTO> getUserByUsername(@PathVariable("username") String username) {
        return Results.success(userService.getUserByUsername(username));
    }

    /**
     * 更新用户信息
     *
     * @param requestParam 用户更新参数
     * @return 成功
     */
    @PutMapping
    public Result<Void> update(@RequestBody UserUpdateReqDTO requestParam) {
        userService.updateUserInfo(requestParam);
        return Results.success();
    }
}
